package com.xhui.reggie.controller;

import com.xhui.reggie.common.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件上传与下载
 */
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}") // 读取application.yml中的变量
    private String basePath;

    /**
     * 上传文件
     *
     * @param file file
     * @return 返回主要数据，上传之后的文件名称
     * @throws IOException IOException
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        // 此处的file必须与前端文件 name属性值 保持一致
        // 注：file会在本地用户下的temp目录下生成一个后缀为.tmp临时文件

        // 1. 得到原始文件的名称
        String originalFilename = file.getOriginalFilename();
        // 截取后缀名:如.jpg ,即截取最后一个以 . 开始往后的字符串
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //2. 使用UUID重新生成文件名，防止文件名称重复造成文件覆盖
        String newFileName = UUID.randomUUID().toString() + suffix;

        File destDir = new File(basePath);
        if (!destDir.exists()) {
            // 指定路径basePath不存在，需创建
            destDir.mkdirs();
        }
        //3. 将临时文件转存到指定位置
        file.transferTo(new File(basePath + newFileName));
        return R.success(newFileName);
    }

    /**
     * 下载文件
     *
     * @param name     文件名
     * @param response 响应对象
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        try (
                // 获取源文件的输入流 将文件从硬盘中输入到内存中
                FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
                // 获取输出流，通过此流将文件写会浏览器，在浏览器展示图片
                ServletOutputStream outputStream = response.getOutputStream();
        ) {
            // 设置响应内容类型
            response.setContentType("image/jpeg");
            int len = 0; // 是否读取完毕的标识
            byte[] buffer = new byte[1024]; // 缓冲字节数组
            while ((len = fileInputStream.read(buffer)) != -1) { // len = -1时，读取完毕
                outputStream.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载图片到本地
     *
     * @param name     文件名称
     * @param response 响应对象
     */
    @GetMapping("/downloadToDefault")
    public void downloadToDefault(String name, HttpServletResponse response) {
        try (
                // 获取源文件的输入流 将文件从硬盘中输入到内存中
                FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
                // 获取输出流，通过此流将文件写会浏览器，在浏览器展示图片
                ServletOutputStream outputStream = response.getOutputStream();
        ) {


            // 响添加应头，将 响应内容 以附件的形式下载到浏览器默认位置
            response.addHeader("Content-disposition", "attachment;filename=" + new String(name.getBytes()));
//            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//            response.setContentType("application/x-msdownload");
            int len = 0; // 是否读取完毕的标识
            byte[] buffer = new byte[1024]; // 缓冲字节数组
            while ((len = fileInputStream.read(buffer)) != -1) { // len = -1时，读取完毕
                outputStream.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
